// 高阶函数(Higher Order Componen): 函数参数如果是函数，或则这个函数返回一个新的函数 我们就叫他高阶函数
//   1）你可以将函数当做另一个函数的参数传入
//   2) 如果一个函数 返回一个新的函数那么这个函数也是高阶函数

//       ↓高阶函数
function fn(){
    return function(){}
}

fn(()=>{});

// 高阶函数的解决的问题
// 1. 保持原有函数的基础上(不改变原有代码)，添加一些自己的功能 -> AOP
// 2. 柯里化 把参数先预置起来(借用闭包的机制)

// AOP 切片(装饰模式)(AOP 面向切片编程 基于高阶函数)
// AOP 主要作用是，把一些跟核心业务逻辑模块无关的功能抽离出来，其实就是给原函数增加一层
Function.prototype.before = function (cb) {
    // 箭头函数中没有arguments
    // ... 剩余运算符 把所有的内容 都变成一个数组
    return (...args) => {
        cb();
        this(...args); // 箭头函数中没有this指向  this 会像上一层查找 即this指向 makeCoffee.before 的 makeCoffee ← 我们的原函数、核心函数
    }
};

function makeCoffee(who){// 原函数 核心函数
    console.log('煮一碗泡面'+who)
}

// this表示 谁调用此函数 this就是谁
let newFunc = makeCoffee.before(function(){
    console.log('烧水')
});

newFunc('给ahhh');

// react中的事务,在某个函数之前 执行一些功能，在之后也可以增加一些功能
